interface IA {
    a: 1,
    a1: 2
}

interface IB {
    b: 1,
    b1: 2
}

/*function log(arg: IA | IB) {
    //报错：类型“IA|IB”上不存在属性“a”。类型“IB”上不存在属性“a”。
    //结论：访问联合类型时，处于程序安全仅能访问联合类型中的交集部分
    if (arg.a) {
        console.log(arg.a1);
    } else {
        console.log(arg.b1);
    }
}*/


/*类型守卫：定义一个函数，它的返回值是一个类型谓词，生效范围为子作用域*/
function getIsIA(arg: IA | IB): arg is IA {
    return !!(arg as IA).a;
}

function log2(arg: IA | IB) {
    if (getIsIA(arg)) {
        console.log(arg.a1);
    } else {
        console.log(arg.b1);
    }
}


//实现函数reverse
function reverse(target: string | Array<any>) {
//typeof类型保护
    if (typeof target === 'string') {
        return target.split('').reverse().join('');
    }

//instance类型保护
    if (target instanceof Object) {
        return target.reverse();
    }
}







